package com.sky.blue.xmltool.jaxb.marshal;

import org.junit.Test;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;

/**
 * JAXB（Java Architecture for XML Binding) 是一个业界的标准，是一项可以根据XML Schema产生Java类的技术。
 * 该过程中，JAXB也提供了将XML实例文档反向生成Java对象树的方法，并能将Java对象树的内容重新写到XML实例文档。
 * 从另一方面来讲，JAXB提供了快速而简便的方法将XML模式绑定到Java表示，从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
 *
 * JAXBContext 类提供到 JAXB API 的客户端入口点。
 * 它提供了管理实现 JAXB 绑定框架操作所需的 XML/Java 绑定信息的抽象，这些操作包括：解组、编组和验证
 *
 *  JDK中JAXB相关的重要Class和Interface：(来源于百度百科JAXB)
 *
 *     JAXBContext类，是应用的入口，用于管理XML/Java绑定信息。
 *     Marshaller接口，将Java对象序列化为XML数据。
 *     Unmarshaller接口，将XML数据反序列化为Java对象
 */
public class TestMarshal {
    @Test
    public void beanToXML() {
        Classroom classroom = new Classroom(1, "软件工程", 4);
        Student student = new Student(101, "张三", 22, classroom);

        try {
            JAXBContext context = JAXBContext.newInstance(Student.class);
            Marshaller marshaller = context.createMarshaller();
            //marshaller.marshal(根元素对象,输出流)
            marshaller.marshal(student, System.out);
        } catch (JAXBException e) {
            e.printStackTrace();
        }

    }

    @Test
    public void XMLStringToBean(){
        String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><student><age>22</age><classroom><grade>4</grade><id>1</id><name>软件工程</name></classroom><id>101</id><name>张三</name></student>";
        try {
            JAXBContext context = JAXBContext.newInstance(Student.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            //unmarshaller.unmarshal(stringReader流)
            Student student = (Student)unmarshaller.unmarshal(new StringReader(xmlStr));
            System.out.println(student);
            System.out.println(student.getAge());
            System.out.println(student.getClassroom().getName());
        } catch (JAXBException e) {
            e.printStackTrace();
        }

    }
}
